package city.spring.modules.expense.service;

import city.spring.modules.expense.entity.ExpenseRecordEntity;
import city.spring.modules.expense.vo.ExpenseRecordEntityVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import lombok.NonNull;
import org.apache.ibatis.annotations.Param;

import java.security.Principal;
import java.util.Date;
import java.util.List;

/**
 * Service：费用记录（缴费/消费）
 *
 * @author pxm
 * @date 2020-08-25 15:19:20
 */
public interface ExpenseRecordService extends IService<ExpenseRecordEntity> {
    String CACHE_NAME = "expense_record";

    /**
     * 业务处理：保存一个 <strong>预存款缴费记录</strong>
     *
     * @param entity 预存缴费记录
     */
    void saveDepositRecord(ExpenseRecordEntity entity, @NonNull Principal user);

    /**
     * 业务处理：保存一个 <strong>一卡通余额缴费记录</strong>
     *
     * @param entity 预存缴费记录
     */
    void saveCardBalanceRecord(ExpenseRecordEntity entity, @NonNull Principal user);

    /**
     * 业务处理：保存一个 <strong>其他消费 消费记录</strong>
     *
     * @param entity 其他消费 消费记录
     */
    void saveOtherConsumptionRecord(ExpenseRecordEntity entity, @NonNull Principal user);

    /**
     * 业务处理：保存一个 <strong>水电消费 消费记录</strong>
     *
     * @param entity 水电消费 消费记录
     */
    void saveWaterOrElectricRecord(ExpenseRecordEntity entity, @NonNull Principal user);

    /**
     * 业务处理：保存一个 <strong>费用记录（缴费/消费）</strong>
     *
     * @param entity 费用记录（缴费/消费）
     */
    void saveExpenseRecord(ExpenseRecordEntity entity);

    /**
     * 业务处理：修改一个 <strong>费用记录（缴费/消费）</strong>
     *
     * @param entity 费用记录（缴费/消费）
     */
    void updateExpenseRecord(ExpenseRecordEntity entity);

    /**
     * 业务处理：删除一个 <strong>费用记录（缴费/消费）</strong>
     *
     * @param primaryKey 主键ID
     */
    void deleteExpenseRecord(String primaryKey);

    /**
     * 业务处理：删除多个 <strong>费用记录（缴费/消费）</strong>
     *
     * @param primaryKeys 主键ID列表
     */
    void deleteExpenseRecord(List<String> primaryKeys);

    /**
     * 分页获取的预存缴费记录
     *
     * @param page    分页对象
     * @param wrapper 查询对象
     * @return 预存缴费记录
     */
    IPage<ExpenseRecordEntityVO> depositListPage(Page<? extends ExpenseRecordEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends ExpenseRecordEntity> wrapper);


    /**
     * 保存入院缴费 生成缴费记录
     *
     * @param entity
     */
    void saveCheckinFee(ExpenseRecordEntity entity);

    /**
     * 保存月度缴费 生成缴费记录
     *
     * @param entity
     */
    void saveMonthFee(ExpenseRecordEntity entity);

    /**
     * 取 某个老人的月度缴费记录
     *
     * @param personId
     * @return
     */
    List<ExpenseRecordEntityVO> getOnesMonthPayRecords(String personId);

    /**
     * 保存退住结算
     *
     * @param entity
     */
    void saveLeaveSettlement(ExpenseRecordEntity entity, Date leaveDate, Date monthEnd, Integer invalidState);


    /**
     * 退住结算记录
     *
     * @param page
     * @param wrapper
     * @return
     */
    IPage<ExpenseRecordEntityVO> getSettlementRecords(Page<? extends ExpenseRecordEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends ExpenseRecordEntity> wrapper);

    /**
     * 根据老人ID获取最新的结算记录，用于结算审核
     *
     * @param oldmanId
     * @return
     */
    ExpenseRecordEntityVO getLatestSettlementRecord(String oldmanId);

    /**
     * 根据费用ID获取最新的结算记录，用于结算审核
     *
     * @param id
     * @return
     */
    ExpenseRecordEntityVO getSettlementRecord(String id);

    /**
     * 审核结算
     *
     * @param entity
     * @param user
     */
    void checkSettlement(ExpenseRecordEntity entity, @NonNull Principal user);

    /**
     * 结算账单：应交账单 根据结算记录Id，对应的老人id，获取入住记录中老人最新的的入住日期、退住日期，再从缴费明细记录获取这两个日期间的明细记录。
     *
     * @param expecseId
     * @return
     */
    List<ExpenseRecordEntityVO> getBillDetailsBetween2Date(String expecseId);

    /**
     * 结算打印：获取长者信息和结算信息
     *
     * @param expenseId
     * @return
     */
    Object getSettlementPrintInfo(String expenseId);

    /**
     * 单据打印：老人最新的入住记录的入住日期、退住日期，再从缴费明细记录获取这两个日期间的明细记录。
     *
     * @param expenseId
     * @return
     */
    List<ExpenseRecordEntityVO> getBillPrintDetail(String expenseId);
}